import { getWindows, getActiveWindow, windowWithTitle } from '@nut-tree/nut-js';

/**
 * 解决 Windows 下 nut.js 窗口中文标题乱码问题
 * 这个解决方案基于以下原理：
 * 1. 检查当前操作系统是否为 Windows
 * 2. 针对 Windows 平台，使用特定的编码处理方法
 */
async function fixWindowsChineseTitleEncoding() {
  // 检查当前操作系统是否为 Windows
  const isWindows = process.platform === 'win32';
  
  console.log('当前操作系统:', isWindows ? 'Windows' : '非 Windows');
  
  if (isWindows) {
    console.log('Windows 系统 - 应用中文标题编码修复');
  } else {
    console.log('非 Windows 系统 - 使用默认编码处理');
  }
  
  try {
    // 获取所有窗口
    const windows = await getWindows();
    console.log('\n检测到的窗口列表:');
    console.log('--------------------------------------------------');
    
    for (const currentWindow of windows) {
      try {
        // 获取窗口标题
        let title = await currentWindow.title;
        
        // 在 Windows 系统上处理可能的编码问题
        if (isWindows) {
          // 尝试进行编码转换 (如果需要)
          // 方案1: 直接使用获取到的标题
          console.log(`窗口标题 [原始]: ${title}`);
          
          // 方案2: 尝试使用 Buffer 进行重新编码
          try {
            const encodedTitle = Buffer.from(title, 'utf8').toString('utf8');
            console.log(`窗口标题 [UTF8处理]: ${encodedTitle}`);
          } catch (e) {
            console.log('UTF8 编码处理失败:', e.message);
          }
        } else {
          console.log(`窗口标题: ${title}`);
        }
        
        console.log('--------------------------------------------------');
      } catch (e) {
        console.error('获取窗口信息失败:', e.message);
      }
    }
    
    // 测试特定中文标题窗口的查找
    try {
      // 注意: 你需要替换为实际存在的中文窗口标题
      const testChineseTitle = '记事本'; // Windows 记事本默认标题
      const chineseWindow = await windowWithTitle(testChineseTitle);
      
      if (chineseWindow) {
        const title = await chineseWindow.title;
        console.log(`\n找到中文标题窗口: ${title}`);
      } else {
        console.log(`\n未找到标题为 "${testChineseTitle}" 的窗口`);
        console.log('请确保有中文标题的窗口处于打开状态');
      }
    } catch (e) {
      console.error('查找中文标题窗口失败:', e.message);
    }
    
  } catch (e) {
    console.error('获取窗口列表失败:', e.message);
  }
}

/**
 * 更高级的 Windows 中文标题编码修复方案
 * 这个函数提供了几种可能的解决方案
 */
async function advancedFixForWindowsEncoding() {
  const isWindows = process.platform === 'win32';
  
  if (!isWindows) {
    console.log('此高级修复仅适用于 Windows 系统');
    return;
  }
  
  console.log('\n=== Windows 中文标题编码高级修复测试 ===');
  
  try {
    const windows = await getWindows();
    
    for (const window of windows.slice(0, 5)) { // 仅测试前5个窗口以避免输出过多
      try {
        const originalTitle = await window.title;
        console.log(`\n原始标题: ${originalTitle}`);
        
        // 方案1: 使用 iconv-lite 进行编码转换 (如果安装了该模块)
        try {
          // 注意: 这需要安装 iconv-lite 包
          // 可以通过 npm install iconv-lite 安装
          let iconvLiteTitle = originalTitle;
          try {
            const iconv = await import('iconv-lite');
            const buffer = Buffer.from(originalTitle, 'binary');
            iconvLiteTitle = iconv.decode(buffer, 'gbk');
            console.log('方案1 (iconv-lite GBK):', iconvLiteTitle);
          } catch (e) {
            console.log('方案1 不可用: 请先安装 iconv-lite 包 (npm install iconv-lite)');
          }
        } catch (e) {
          console.log('方案1 错误:', e.message);
        }
        
        // 方案2: 使用不同的字符串处理方法
        try {
          const processedTitle = Array.from(originalTitle)
            .map(char => char.charCodeAt(0) > 127 ? '特殊字符' : char)
            .join('');
          console.log('方案2 (字符处理):', processedTitle);
        } catch (e) {
          console.log('方案2 错误:', e.message);
        }
        
      } catch (e) {
        console.error('处理窗口标题失败:', e.message);
      }
    }
    
  } catch (e) {
    console.error('获取窗口列表失败:', e.message);
  }
}

// 运行测试
console.log('=== Windows 中文标题编码测试工具 ===');
console.log('nut.js 版本:', require('@nut-tree/nut-js/package.json').version);
await fixWindowsChineseTitleEncoding();
// 取消下面的注释以运行高级修复测试
// await advancedFixForWindowsEncoding();